#include<bits/stdc++.h>
using namespace std;
long long T,n,m,l,v,d[100009],v1[100009],a[100009],p[100009],ans=-1e18,ans1=1e18,ans2=0,ans3=0,ans4=1e18,m1[100009],qwe=0;
int main()
{
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	scanf("%lld",&T);
	for(long long i=1;i<=T;i++){
		scanf("%lld%lld%lld%lld",&n,&m,&l,&v);
		for(long long j=1;j<=n;j++){
			scanf("%lld%lld%lld",&d[j],&v1[j],&a[j]);
			ans=max(ans,a[j]);
			ans1=min(ans1,a[j]);
		}
		for(long long j=1;j<=m;j++){
			scanf("%lld",&p[j]);
			ans2=max(ans2,p[j]);
			ans4=min(ans4,p[j]);
		}
		if(ans==ans1){
			for(long long j=1;j<=n;j++){
				if((v1[j]>v)&&(d[j]<=ans2)){
					ans3++;
				}
			}
			printf("%lld ",ans3);
			if(ans3>0)printf("%lld\n",m-1);
			else printf("%lld\n",m);			
		}
		if(ans1>0){
			for(long long j=1;j<=n;j++){
				if((v1[j]*v1[j]+2*a[j]*(ans2-d[j])>v*v)&&d[j]<=ans2){
					ans3++;
				}
			}
			printf("%lld ",ans3);
			if(ans3>0)printf("%lld\n",m-1);
			else printf("%lld\n",m);	
		}
		if(!((ans==ans1)||(ans1>0))){
			for(long long j=1;j<=n;j++){
				if(a[j]==0){
					if((v1[j]>v)&&(d[j]<=ans2)){
						ans3++;
						m1[n]=1;
					}
				}
				if(a[j]>0){
					if((v1[j]*v1[j]+2*a[j]*(ans2-d[j])>v*v)&&d[j]<=ans2){
						ans3++;
						m1[n]=1;
					}				
				}
				if(a[j]<0){
					for(long long qw=1;qw<=m;qw++){
						if(p[qw]>=d[j]){
							if((v1[j]*v1[j]+2*a[j]*(p[qw]-d[j])>v*v)){
								ans3++;
								m1[qw]=1;
							}
						}
					}
				}
			}
			for(long long j=1;j<=n;j++)if(m1[j]==1)qwe++;
			printf("%lld %lld\n",ans3,qwe);
			for(long long j=1;j<=n;j++)m1[j]=0;
		}
		ans=0,ans1=1e18,ans2=0,ans3=0,ans4=1e18,qwe=0;
	}
	return 0;
}
